﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ebDoc = eRechnung.Globals;


namespace eRechnung
{
    public partial class FrmSkonto : Form
    {
        public FrmSkonto()
        {
            InitializeComponent();
            ebDoc.ThisDocument.FillSkontoTable(this.dsInvoice);
            this.lblReBetrag.Text = ebDoc.ThisDocument.BetragInklMwSt.ToString("#,##0.0");
            // this.lblReDatum.Text = ebDoc.ThisDocument.CC_InvoiceDate.Text;
            DateTime p;
            this.dateTimeFaellig.Value = DateTime.TryParse(ebDoc.ThisDocument.CC_DueDate.Text, out p) ? p : DateTime.Now;
            this.dateTimeFaellig.MinDate = DateTime.TryParse(ebDoc.ThisDocument.CC_InvoiceDate.Text, out p) ? p : DateTime.Now;
        }

        private void CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            string errorTxt = string.Empty;
            DataGridViewCell cell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
            DateTime ReDatum = ebDoc.ThisDocument.Rechnungsdatum;
            DateTime FaelDatum = this.dateTimeFaellig.Value; // ebDoc.ThisDocument.FaelligDatum;
            decimal wert = 0;
            cell.ErrorText = "";
            string fname = dataGridView1.Columns[e.ColumnIndex].Name;
            if (dataGridView1.Columns[e.ColumnIndex].ReadOnly)
            {
                return;
            }
            switch (fname)
            {
                case "spBisDatum":

                    try
                    {
                        DateTime Datum = DateTime.Parse(e.FormattedValue.ToString());
                        if (Datum.CompareTo(ReDatum) <= 0)
                        {
                            errorTxt = dataGridView1.Columns[e.ColumnIndex].HeaderText + " liegt vor dem Rechnungsdatum.";
                            e.Cancel = true;
                        }
                        if (Datum.CompareTo(FaelDatum) > 0)
                        {
                            errorTxt = dataGridView1.Columns[e.ColumnIndex].HeaderText + " liegt nach dem Fälligkeitsdatum.";
                            e.Cancel = true;
                        }
                    }
                    catch (Exception ex)
                    {
                        errorTxt = dataGridView1.Columns[e.ColumnIndex].HeaderText + " ist kein Datum.";
                        e.Cancel = true;
                    }
                    break;
                case "spSkontoProz":
                case "spSkontoTage":
                    //if (e.FormattedValue.ToString() == "")
                    //{
                    //    return;
                    //}
                    try
                    {
                        wert = decimal.Parse(e.FormattedValue.ToString());
                        if (wert <= 0)
                        {
                            errorTxt = dataGridView1.Columns[e.ColumnIndex].HeaderText + " ist kleiner oder gleich als 0.";
                            e.Cancel = true;
                        }
                    }
                    catch (Exception ex)
                    {
                        errorTxt = dataGridView1.Columns[e.ColumnIndex].HeaderText + " ist nicht numerisch oder leer.";
                        e.Cancel = true;
                    }

                    break;
                default:
                    break;
            }

            switch (dataGridView1.Columns[e.ColumnIndex].Name)
            {
                case "spSkontoProz":
                    if ((e.FormattedValue != null) && (e.Cancel == false))
                    {
#if ebInterface4Bund
                        if (decimal.Parse(e.FormattedValue.ToString()) >= 100)
                        {
                            errorTxt = "Skonto % muss kleiner 100% sein.";
                            e.Cancel = true;
                        }
#else
                        if (decimal.Parse(e.FormattedValue.ToString()) > 100)
                        {
                            errorTxt = "Skonto % muss kleiner gleich 100% sein.";
                            e.Cancel = true;
                        }
#endif
                    }
                    break;

                case "spSkontoTage":

                    // spBisDatum ausrechnen
                    decimal tage = decimal.Parse(wert.ToString());
                    TimeSpan ts = new TimeSpan(Convert.ToInt32(tage), 0, 0, 0);
                    DateTime Datum = ReDatum.Add(ts);
                    if (Datum.CompareTo(ReDatum) < 0)
                    {
                        errorTxt = "Berechnetes Skontodatum liegt vor dem Rechnungsdatum." + "\n Ändern Sie die Skonto Tage oder das Fälligkeitdatum.";
                        // dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = 0;
                        e.Cancel = true;
                    }
                    if (Datum.CompareTo(FaelDatum) > 0)
                    {
                        errorTxt = "Berechnetes Skontodatum liegt nach dem Fälligkeitsdatum." + "\n Ändern Sie die Skonto Tage oder das Fälligkeitdatum.";
                        // dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = 0;
                        e.Cancel = true;
                    }
                    if (e.Cancel == false)
                    {
                        this.dataGridView1.Rows[e.RowIndex].Cells["spBisDatum"].Value = Datum;
                    }
                    break;
                default:
                    break;

            }

            if (e.Cancel == true)
            {
                MessageBox.Show(errorTxt , "Eingabefehler", MessageBoxButtons.OK, MessageBoxIcon.Error);

                // this.dateTimeFaellig.Focus();
                // cell.ErrorText = errorTxt;
            }
        }

        private void BtnSave_Click(object sender, EventArgs e)
        {
            // Prüfung des DueDates gegen die Tabelle der Skonti
            DateTime fDatum = new DateTime();
            foreach (DsInvoice.TblInvSkontoRow skRow in dsInvoice.TblInvSkonto)
            {
                fDatum = skRow.SpBisDatum;  // Skontodatum
                if (DateTime.Compare(fDatum, dateTimeFaellig.Value) > 0)
                {
                    DialogResult dRes = MessageBox.Show("Skontodatum " + fDatum.ToShortDateString() + " liegt vor dem Fälligkeitsdatum " + dateTimeFaellig.Value.ToShortDateString() + "\nSpeichern fortsetzen Ja oder Nein?", "Eingabefehler", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                    if (dRes == DialogResult.No)
                    {
                        return;
                    }
                }
            }

            int Cnt = this.dsInvoice.TblInvSkonto.Rows.Count - 1;
            for (int i = Cnt; i > 0; i--)
            {
                DsInvoice.TblInvSkontoRow row = (DsInvoice.TblInvSkontoRow)dsInvoice.TblInvSkonto.Rows[i];
                if ((row.SpSkontoProz == 0) && (row.SpTage == 0))
                {
                    dsInvoice.TblInvSkonto.Rows[i].Delete();
                }
            }

            ebDoc.ThisDocument.SaveSkonto(this.dsInvoice);
            ebDoc.ThisDocument.CC_DueDate.Text = dateTimeFaellig.Value.ToString("yyyy-MM-dd");
            this.Close();
        }

        private void BtnCancel_Click(object sender, EventArgs e)
        {
            
            this.Close();
        }


        private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            if (BtnCancel.Focused == true) // Cancel Button focused, its assumed cancel clicked...
            {
                return;
            }
            if (dateTimeFaellig.Focused == true)
            {
                return;
            }
            int n = dataGridView1.CurrentCell.ColumnIndex;
            //if (this.dataGridView1.Columns[n].Name == "BtnDel")
            //{
            //    return;
            //}

            CellValidating(sender, e);
        }


        private void dataGridView1_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e)
        {
            //e.Row.Cells["spBisDatum"].Value = DateTime.Parse(ebDoc.ThisDocument.CC_InvoiceDate.Text);
            e.Row.Cells["spBisDatum"].Value = ebDoc.ThisDocument.Rechnungsdatum;
            // e.Row.Cells["spBisDatum"].MinDate = this.dateTimeFaellig.Value;
            e.Row.Cells["spSkontoProz"].Value = 0;
            e.Row.Cells["spSkontoTage"].Value = 0;
            e.Row.Cells["spSkontoBetrag"].Value = 0;
            e.Row.Cells["spBasisBetrag"].Value = ebDoc.ThisDocument.BetragExklMwSt;
        }


        private void dataGridView1_CellLeave(object sender, DataGridViewCellEventArgs e)
        {
            // spSkontoTage
            // spBisDatum
            DateTime ReDatum = ebDoc.ThisDocument.Rechnungsdatum;
            DateTime FaelDatum = ebDoc.ThisDocument.FaelligDatum;
            decimal tage = 0;
            string wert = null;
            DateTime Datum;
            TimeSpan ts = new TimeSpan();
            switch ((dataGridView1.Columns[e.ColumnIndex].Name))
            {
                case "spSkontoTage":
                    // spBisDatum ausrechnen
                    //wert = this.dataGridView1.Rows[e.RowIndex].Cells["spSkontoTage"].EditedFormattedValue.ToString();
                    //if (wert == "")
                    //{
                    //    return;
                    //}
                    //tage = decimal.Parse(wert.ToString());
                    //ts = new TimeSpan(Convert.ToInt32(tage),0,0,0);
                    //Datum=ReDatum.Add(ts);
                    //this.dataGridView1.Rows[e.RowIndex].Cells["spBisDatum"].Value = Datum;
                    break;
                case "spBisDatum":
                    // Skontotage ausrechnen
                    wert = this.dataGridView1.Rows[e.RowIndex].Cells["spBisDatum"].EditedFormattedValue.ToString();
                    if (wert == "")
                    {
                        return;
                    }
                    Datum = DateTime.Parse(wert.ToString());
                    ts = Datum.Subtract(ReDatum);
                    tage = Convert.ToDecimal(ts.TotalDays);
                    this.dataGridView1.Rows[e.RowIndex].Cells["spSkontoTage"].Value = tage;
                    break;
                default:
                    break;
            }
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.dataGridView1.Columns[e.ColumnIndex].Name == "BtnDel")
            {
                this.dataGridView1.Rows.RemoveAt(e.RowIndex);
            }
        }

        private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {
            int n = dataGridView1.CurrentCell.ColumnIndex;
            if (this.dataGridView1.Columns[n].Name == "BtnDel")
            {
                dataGridView1.CurrentCell.Selected = false;
            }

        }

        private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            string feld = this.dataGridView1.Columns[e.ColumnIndex].HeaderText;
            MessageBox.Show("Fehler bei der Eingabe in der Spalte " + feld + ".", "Skontotabelle", MessageBoxButtons.OK, MessageBoxIcon.Error);
            e.Cancel = true;
        }

        private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            int iRow = e.RowIndex;
            int iCol = e.ColumnIndex;
            this.dataGridView1.CurrentCell.ErrorText = string.Empty;
        }

        private void dataGridView1_RowLeave(object sender, DataGridViewCellEventArgs e)
        {
#if ebInterface4Bund
            if (dataGridView1.RowCount > 2)
            {
                //MessageBox.Show("Max. 2 Skontozeilen zulässig.", "Skontotabelle", MessageBoxButtons.OK,
                //                MessageBoxIcon.Error);
                dataGridView1.AllowUserToAddRows = false;
            }
#endif
        }

        private void dataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
        {
#if ebInterface4Bund
            if (dataGridView1.RowCount < 2)
            {
                dataGridView1.AllowUserToAddRows = true;
            }
#endif
        }

        private void dateTimeFaellig_ValueChanged(object sender, EventArgs e)
        {
            DateTime p;
            DateTime DueDate = (DateTime)dateTimeFaellig.Value;
            DateTime reDate = DateTime.TryParse(ebDoc.ThisDocument.CC_InvoiceDate.Text, out p) ? p : DateTime.Now;
            TimeSpan ts = DueDate - reDate;
            tbMaxSkontoTage.Text = ts.Days.ToString();
        }



    }
}
